/*
之前学习过基本类型的转换，支持从一种数据类型转换为另一种数据类型，类也支持类型转换的(仅限于存在亲缘关系的类之间进行转换)
比如继承关系或接口实现的（接口后面再讲），如子类可以向上转型
 */
package com.test.Encapsulation_Inheritance_Polymorphism;

public class TypeConversion {
    public static void main(String[] args) {
        Student stu = new SportStudent("lbw", 30);  //通过父类接受子类类型，父类变量引用子类实例
        // 只是当做Student父类操作而已，基本的实现还是子类的实现
        stu.study();  //得到依然是具体实现的结果，而不是当前类型的结果
        //使用stu.无法自动提示子类的方法，比如SportStudent的exercise()方法，只能使用父类的方法，但重写方法除外，比如study()
        //那怎么调用子类的方法，在明确知道对象是哪个类实现的父类引用，可以强制转回去
        SportStudent sp = (SportStudent) stu; //强制转换回去，写法和基本类型相似，（括号）里要转成类型，这就叫向下专项
        //但系统提示可以直接把stu定义成SportStudent类型来避免强制转换
        sp.exercise();  //就可以调用SportStudent的exercise方法了

        //强制类型转换（向下转型）一定要确定对象是哪个类型实现的父类引用，转换错会报错的
//        ArtStudent as = (ArtStudent) stu;  //会报错
//        // 不能把com.test.Encapsulation_Inheritance_Polymorphism.SportStudent转换为com.test.Encapsulation_Inheritance_Polymorphism.ArtStudent
//        as.art();
        Judge(stu);  //调用下面的jedge方法来判断类型
        System.out.println(stu instanceof Student);  //判断stu是不是Student类型，idea提示always ture
        System.out.println(stu instanceof SportStudent);  //判断stu是不是SportStudent类型，idea提示always ture
        //因为SportStudent是继承Student，instanceof 不仅判断是不是当前类型，对继承的类也会判断为真
    }

    /*
    如果我们只是得到一个父类的引用，而不知道它是哪个子类的实现怎么办，可以使用instanceof关键词判断类型
     */
    public static void Judge(Student student){  //定义一个Judge方法，使用instanceof判断传入的类型。在main方法里调用这个Judge方法
        if (student instanceof SportStudent) {
            SportStudent sportStudent = (SportStudent) student;
            sportStudent.exercise();
        }else if (student instanceof ArtStudent) {
            ArtStudent artStudent = (ArtStudent) student;
            artStudent.art();
        }
    }


}




/* 代码打印结果
    我是体育生
    我不爱运动，爱打游戏，打游戏使我沉迷
*/